package com.rem.se.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * Class的常用方法
 * <p>
 * <p>
 * 方法名	                                        说明
 * static Class forName(String name)	    返回指定类名name对应的Class对象
 * Object newInstance()	                    调用缺省构造函数，返回Class对象的一个实例
 * String getName()	                        返回此Class对象所表示的实体（类、接口、数组类或者void）的名称
 * Class getSuperClass	                    返回当前Class对象的父类Class对象
 * Class[] getinterfaces()	                获取当前Class对象的接口
 * ClassLoader getClassLoader()	            返回该类的加载器
 * Constructor[] getConstructors()	        返回一个包含某些Constructor对象的数组
 * Method getMothed(String name,Class… T)	返回一个Method对象，此对象形参类型为param Type
 * Fied[] getDeclaredFields()	            返回Field对象的一个数组
 *
 * @author Rem
 * @date 2021-03-15
 */

public class Demo06 {


    public static void main(String[] args) throws Exception {


        /**
         * 总之：getDeclared...的关键词是：自身，所有方法，不继承
         * 而get..s的关键词是public 继承
         */

        Class<?> c1 = Class.forName("com.rem.se.reflect.User");
        //class com.rem.se.reflect.User
        System.out.println(c1);

        System.out.println("对象所在包全称:" + c1.getName());
        System.out.println("对象简称:" + c1.getSimpleName());


        Constructor<?>[] constructors = c1.getConstructors();
        for (Constructor<?> constructor : constructors) {
            System.out.println("public构造:" + constructor);
        }
        Constructor<?>[] declaredConstructors = c1.getDeclaredConstructors();
        for (Constructor<?> declaredConstructor : declaredConstructors) {
            System.out.println("全部构造:" + declaredConstructor);
        }
        System.out.println("根据字段获得构造:" + c1.getConstructor(String.class));


        Field[] declaredFields = c1.getDeclaredFields();
        for (Field declaredField : declaredFields) {
            System.out.println("所有属性:" + declaredField);
        }
        Field[] fields = c1.getFields();
        for (Field field : fields) {
            System.out.println("公有属性:" + field);
        }
        System.out.println("根据名称获得公有属性:" + c1.getField("score"));


        Method[] methods = c1.getMethods();
        for (Method method : methods) {
            System.out.println("public方法:" + method);
        }
        Method[] declaredMethods = c1.getDeclaredMethods();
        for (Method declaredMethod : declaredMethods) {
            System.out.println("所有方法:" + declaredMethod);
        }
        System.out.println("根据名称获得public方法:" + c1.getMethod("setName", String.class));


        System.out.println("根据名称获得全部注解方法:" + c1.getDeclaredAnnotations());
        System.out.println("根据名称获得注解方法(包含父类):" + c1.getAnnotations());


    }
}
